package com.tangruojie;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 级别	    用途	                            示例说明
 * ERROR	严重错误（通常是无法恢复的错误）	    程序模块崩溃、连接数据库失败、重要配置加载失败等。
 * WARN	    警告（程序能运行，但可能存在隐患）	参数格式异常、使用了过时的接口、性能可能受影响等。
 * INFO	    信息（正常运行时的关键信息）	        服务启动、关闭、接口调用成功、业务流程节点等。
 * DEBUG	调试（开发阶段调试信息）	        变量值、逻辑分支走向、中间过程数据等。
 * TRACE	追踪（更细粒度的调试）	            方法进出栈、内部细节跟踪、循环迭代细节等。
 * ---------
 * 日志级别是表示“日志消息的重要程度”，不是“错误种类”。
 * 设置合适的日志级别可以在不同场景（开发、测试、生产）输出不同粒度的日志信息，便于排查问题或分析性能。
 */

/**
 * 桥接模块（Bridge Module）是为了让不同的日志系统相互兼容。
 * 桥接模块的本质是把其他日志系统的日志“导入”到 SLF4J 统一处理，就像修建“管道”，让不同系统的输出全部经过 SLF4J。
 * 桥接模块 = 日志系统“翻译器”，用于统一日志输出渠道，让各种日志都流向 SLF4J，避免混乱。
 * 桥接模块只负责“连接”不同日志系统，把日志“转发”给 SLF4J，它本身不负责日志的实际输出（如打印到控制台、文件、JSON 等），实现仍需由真正的“日志实现类”来完成。
 * ---------
 * slf4j-api + jul-to-slf4j + logback-classic 的意思是：
 * JUL 是你的日志“来源”
 * SLF4J 是你的日志“统一入口”
 * Logback 是你的日志“最终输出实现”
 * ---------
 * 1、调用 JUL（java.util.logging）
 * │
 * ▼
 * 2、[jul-to-slf4j] 捕获 JUL 日志事件（通过 handler 机制）
 * │
 * ▼
 * 3、SLF4J API 接口统一转发
 * │
 * ▼
 * 4、[logback-classic] 接收日志，负责格式化和输出
 * ---------
 * 那为什么不是用 JUL 自身输出？
 * 因为 jul-to-slf4j 桥接模块的目标就是：
 * 让 JUL 不再自己输出日志，而是“导入”到 SLF4J → 最终交给你配置的日志实现输出（比如 Logback）。
 * 这种做法的好处：
 * ✅ 所有日志（JUL、log4j、Commons Logging）都能统一走 SLF4J，不混乱
 * ✅ 不需要配置多个日志系统
 * ✅ 可以用强大的 Logback 控制输出格式、文件滚动、异步等高级功能
 */
public class SLF4JTest {

    public static final Logger LOGGER = LoggerFactory.getLogger(SLF4JTest.class);

    /**
     * 快速入门
     */
    @Test
    public void testQuick() {
        /**
         * 日志输出
         */
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
    }

}
